www.gusucode.com > php框架系统:MDPHP麦迪源码 v1.xPHP源码程序 > php框架系统:MDPHP麦迪源码 v1.x/mdphp_v1.0.beta/mdphp_v1.0.beta/Library/Plugin.php

    <?php

	/**
	 * 麦迪钩子&插件类
	 * @author: 麦迪科技 <i@md8.cc>
	 * @link: http://soft.md8.cc
	 * @version: 1.0
	 */

	abstract class Plugin{

		static private $gather=array();

		/**
		 * 实例化
		 */
		final public function __construct(){

		}

		/**
		 * 获取
		 */
		final public function __get($name){
			return I('t.' . $name);
		}

		/**
		 * 设置
		 */
		final public function __set($name, $value){
			$GLOBALS['MDPHP']->assign($name, $value);
		}

		/**
		 * 重载
		 */
		final public function __call($name, $args){
			if(method_exists($GLOBALS['MDPHP'], $name)){
				return call_user_func_array(array($GLOBALS['MDPHP'], $name), $args);
			}
		}

		/**
		 * 添加插件
		 * @param	string			$event	事件名
		 * @param	string/array	$name	插件名
		 */
		static public function add($event, $name){

			if(empty(self::$gather[$event]))
				self::$gather[$event] = array();

			if(is_array($name))
				self::$gather[$event] = array_merge(self::$gather[$event], $name);
			else
				self::$gather[$event][] = $name;

		}

		/**
		 * 获取插件信息
		 * @param	string	$event	事件名, 为空获取所有
		 * @return	array			插件组
		 */
		static public function get($event=null){
			if(is_null($event))
				return self::$gather;
			else
				return self::$gather[$event];
		}

		/**
		 * 导入插件
		 * @param	array	$data		插件组
		 * @param	boolean	$overlay	是否覆盖导入
		 */
		static public function import($data, $overlay=false){

			if($overlay){												//覆盖
				self::$gather = array_merge(self::$gather, $data);
			}else{
				foreach($data as $key => $value){
					if(empty(self::$gather[$key]))
						self::$gather[$key] = array();
					if(empty($value['_overlay'])){						//合并
						self::$gather[$key] = array_merge(self::$gather[$key], $value);
					}else{												//指定合并
						unset($value['_overlay']);
						self::$gather[$key] = $value;
					}
				}
			}

		}

		/**
		 * 执行插件
		 * @param	string	$name	名称
		 * @param	array	$event	事件
		 * @param	array	$param	参数
		 * @return	[type]			返回值
		 * 
		 * exec('name')
		 * exec('name', array(1, 2))
		 * exec('name', 'a')
		 * exec('name', 'a', array(1, 2))
		 * 
		 */
		static public function exec($name, $event='run', &$param=array()){

			if(is_array($event)){
				$param = $event;
				$event = 'run';
			}

			$file = self::getFileName($name);
			if(!import($file, '')) error('Not_Load_Plugin', $file);

			if(!class_exists($name)) error('该插件代码格式不正确');

			$class = new $name();
			if(!method_exists($class, $event)) error('Plugin_Method_Not_Exist', null, $name, $event);
			return call_user_func_array(array($class, $event), (array)$param);

		}

		/**
		 * 钩子监听
		 * @param	string	$event	事件名
		 * @param	array	&$param	参数
		 */
		static public function listen($event, &$param=array()){

			if(isset(self::$gather[$event])){
				foreach(self::$gather[$event] as $value){
					if(self::exec($value, $event, $param) === false)	//中断执行
						return;
				}
			}

		}

		/**
		 * 获取插件信息
		 * @param	string	$name	插件名
		 * @return	array
		 */
		static public function getInfo($name){

			$file = self::getFileName($name);
			if(!import($file, ''))
				return null;

			return class_exists($name) ? $name::$info : null;

		}

		/**
		 * 获取文件名
		 * @param	string	$name	插件名
		 * @return	string
		 */
		static public function getFileName(&$name){

			//名称、事件
			$array = explode('/', $name);
			if(count($array) == 2)
				list($module, $name) = explode('/', $name);

			//格式化
			isset($module)		&& $module.=($module ? '/' : '');

			//目录解析
			$path = MD_PATH.(isset($module) ? ucfirst($module) : MD_PATH_MODULE).C('LAYER_P').'/';
			if(is_dir($path.ucfirst($name)))
				$path .= ucfirst($name).'/public.php';
			else
				$path .= $name.'.php';

			return $path;

		}

		/**
		 * 安装-抽象
		 * @return	boolean	是否允许安装
		 */
		abstract public function install();

		/**
		 * 卸载-抽象
		 * @return	boolean	是否允许卸载
		 */
		abstract public function uninstall();

	}